package com.mingyuean.demo.spring.factory.support;

import com.mingyuean.demo.spring.BeanException;
import com.mingyuean.demo.spring.factory.config.BeanDefinition;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author MingYueAn
 * <p>  默认列表Bean工厂
 * <p>  2023/3/19 16:27
 * @version: 1.0
 */
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry {
    /**
     * ConcurrentHashMap 是线程安全的 Map 集合，用于存储 bean 名称和对应的 BeanDefinition 对象
     */
    public final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();

    /**
     * 通过 beanName 获取对应的 BeanDefinition 对象
     *
     * @param beanName bean的名称
     * @return 对应的 BeanDefinition 对象
     */
    @Override
    protected BeanDefinition getBeanDefinition(String beanName) {
        // 从 beanDefinitionMap 中获取 beanName 对应的 BeanDefinition
        final BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);
        if (beanDefinition == null) {
            // 如果 beanDefinition 为 null，说明该 bean 不存在，抛出 BeanException 异常
            throw new BeanException(beanName + "不存在");
        }
        // 返回 beanName 对应的 BeanDefinition
        return beanDefinition;
    }

    /**
     * 注册 BeanDefinition 对象
     *
     * @param beanName       bean名称
     * @param beanDefinition bean
     */
    @Override
    public void registryBeanDefinition(String beanName, BeanDefinition beanDefinition) {
        // 将 beanName 和对应的 BeanDefinition 对象放入 beanDefinitionMap 中
        beanDefinitionMap.put(beanName, beanDefinition);
    }
}
